iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
0
自我挑戰組

非本科之30天Ruby / Rails學習筆記系列 第 7

Day7: Ruby裡的self是什麼?

  • 分享至 

  • xImage
  •  

之前的文章有提過一句話「在Ruby裡,幾乎所有的東西都是物件」,這是否也代表每一行我們所打的code是否都屬於物件呢?

self在Ruby是一個非常特別的存在,且永遠指向目前正在執行的物件,換句話說,就是self會根據現在放在哪個context(class、method..)的不同,指的當下就是物件自己。

這樣描述還是很模糊的感覺,下面會用幾個例子去理解self放在不同context的時候,會長什麼樣子。

Top Level Context

name = "Louis"
puts "Name is: #{name}"
puts "Self is: #{self}"
puts "Self class is: #{self.class}"

# =>
# Name is: Louis
# Self is: main
# Self class is: Object

這裡可以看到self是個main物件,且main物件是類別Object下的實體,如果用程式碼寫:

class Object
  def reflect
  end
end

main = Object.new   #main大概是這種感覺

self在實體方法(instance method)與類別方法(class method)

class Louis
  def say
    puts self
  end
  
  def self.say
    puts self
  end
end

#實體方法
kk = Louis.new
kk.say    # => 此時的self為Louis class所產生的實體 <Louis:0x00007fad048259e8>

#類別方法
Louis.say # => 此時的self為Louis class本身

類別定義(class definition)

class Louis
    puts "Self is: #{self}"
end

# => Self is: Louis    

此時的self為Louis class本身 => Louis

模組定義(Module definition)

module Group
  puts "Self inside Group is: #{self}"
end

# => Self inside Group is: Group

此時的self為module Group本身 => Group

模組裡包類別(module including class)

module Group
  puts "Self inside Group is: #{self}" 
  # => Self inside Group is: Group
  
  class Louis
    puts "Self inside Group is: #{self}"
    # => Self inside Group is: Group::Louis
  end
end

這裡的class是包在module裡面,所以這裡的self是Group::Louis

繼承(inheritance)時的self

class Lion
  def say
    puts self
  end
end

class Pig < Lion
end

ponpon = Pig.new
ponpon.say  # => #<Pig:0x00007fcb8801ca38>

此時的self為Pig class所產生的實體

引入模組(include module)時的self

module Pig
  def say
    puts self
  end
end

class Lion
  include Pig
end

mufasa = Lion.new
mufasa.say  # => #<Lion:0x00007fa502824390>

此時的self為Lion class所產生的實體

總結

  1. 在實體方法、繼承、引入模組都使用了實體方法,所以此時的self都為該類別所產生的實體。
  2. 在類別方法、類別定義、模組定義時,self都為該類別、模組本身。
  3. 在模組裡包類別時,self為”模組::類別“。

參考資料:
Self in Ruby:A Comprehensive Overview
Understanding self in Ruby
@/@@ vs. self in Ruby
Ruby’s Main Object (Top Level Context)
Rubyのselfが微妙に意味がわからなかったので、様々な文脈(トップレベル、class定義内、method定義内、module定義内)で出力してみた
Ruby 中的self變數以及應用

“Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.”

— Thomas Edison, Inventor

本文同步發佈於: https://louiswuyj.tw/


上一篇
Day6: 類別(Class)與模組(Module)的差異
下一篇
Day8: Module的引入include和extend
系列文
非本科之30天Ruby / Rails學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言